#include <stdio.h>
#include <stdlib.h>

typedef int HElemSet;
typedef int Position; /* 数组下标即为元素位置 */
typedef struct BinaryHeapNode *MaxHeap;
typedef struct BinaryHeapNode *MinHeap;
struct BinaryHeapNode {
    HElemSet *data; /* 数据元素数组 */
    int size; /* 规模 */
    int capacity; /* 容量 */
};

/* 线性表定义 */
#define kMaxSize 10000
#define NIL -1
typedef HElemSet ElemSet;

typedef int Position; /* 整型下标，表示元素的位置 */
typedef struct ListNode *List;
struct ListNode {
    ElemSet data[kMaxSize]; /* 存储数据的数组 */
    Position last; /* 线性表中最后一个元素在数组中的位置 */
};

void InitList(List list) {
    list->last = -1;
}
/* 线性表定义结束 */

void InitPQueue(MinHeap pq, int capacity) {
    pq->capacity = capacity;
    pq->size = 0;
    pq->data = (HElemSet *)malloc(sizeof(HElemSet) * capacity);
}

void SiftDown(MinHeap h, Position i) {
    Position last, child;
    HElemSet elem;

    last = h->size; /* 这是最后一个元素的位置 */
    elem = h->data[i];
    while (1) {
        child = i << 1; /* child当前是i的左孩子的位置 */
        if (child < last
                && h->data[child + 1] < h->data[child]) { /* 如果i有右孩子并且右孩子更小 */
            child++; /* child更新为i的右孩子的位置 */
        } else if (child > last) { /* 如果i是叶子结点 */
            break; /* 已经调整到底，跳出循环 */
        }
        if (elem > h->data[child]) { /* 若较小的孩子比elem小 */
            h->data[i] = h->data[child]; /* 将较小的孩子结点上移 */
            i = child; /* i指向原结点的孩子结点，即向下调整 */
        } else { /* 若所有孩子都不比elem小 */
            break; /* 则找到了elem的最终位置，跳出循环 */
        }
    }
    h->data[i] = elem;
}

/* 算法6-6：二叉堆的快速建堆操作 MakeHeapDown(h) */
void MakeHeapDown(MinHeap h) {
    Position last;
    int i;

    last = h->size; /* 这是最后一个元素的位置 */
    for (i = last >> 1; i > 0; i--) {
        SiftDown(h, i); /* 自底向上调整 */
    }
}
/* 算法6-6 结束 */

void MakePQueue(MinHeap h, List list) {
    /* 以 list 中所有元素创建一个优先级队列 pq */
    int n, i;

    n = list->last + 1; /* 获得表长 */
    for (i = 0; i < n; i++) {
        h->data[i + 1] = list->data[i]; /* 复制list到pq中 */
    }
    h->size = n;
    MakeHeapDown(h); /* 快速建堆 */
}

int main(void) {
    MinHeap h;
    List list;
    int capacity, n, i;
    HElemSet x;

    h = (MinHeap)malloc(sizeof(struct BinaryHeapNode));
    scanf("%d", &capacity);
    InitPQueue(h, capacity);
    list = (List)malloc(sizeof(struct ListNode));
    InitList(list);
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &list->data[i]); /* 读入一个线性表 */
        list->last++;
    }
    MakePQueue(h, list);
    for (i = 1; i <= h->size; i++) { /* 输出调整后的堆元素 */
        printf("%d\n", h->data[i]);
    }
    return 0;
}